#include <config.h>
#include <client.h>
#include <interface.h>

#include <memory>

using namespace std;
using namespace Chat;

int main()
{
    int sockfd, choice, ret;   // choice代表用户在主界面所做选择,ret代表操作结果
    struct sockaddr_in servaddr, local_addr;
    struct hostent*    host;
    socklen_t          len;

    /*声明消息变量*/
    Message message{};
    /*声明消息缓冲区*/
    char buf[MAX_LINE]{};

    /*UserInfo*/
    User user{};
    strcpy(user.userName, "***");
    user.speak = Flag::NO;

    while (1) {
        /*(1) 创建套接字*/
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket error");
            exit(1);
        }   // i

        /*(2) 设置链接服务器地址结构*/
        bzero(&servaddr, sizeof(servaddr)); /*清空地址结构*/
        servaddr.sin_family = AF_INET;      /*使用IPV4通信域*/
        servaddr.sin_port   = htons(PORT);  /*端口号转换为网络字节序*/
        // servaddr.sin_addr   = *((struct in_addr*)host->h_addr); /*可接受任意地址*/
        if (inet_pton(AF_INET, SERVER_ADDR.c_str(), &servaddr.sin_addr) < 0) {
            printf("inet_pton error for %s\n", SERVER_ADDR.c_str());
            exit(1);
        }   // if

        /*(3) 发送链接服务器请求*/
        if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
            perror("connect error");
            exit(1);
        }   // if

        getsockname(sockfd, (struct sockaddr*)&local_addr, &len);

        /*(4) 显示聊天室主界面*/
        mainInterface();
        setbuf(stdin, NULL);   // 是linux中的C函数，主要用于打开和关闭缓冲机制
        scanf("%d", &choice);
        setbuf(stdin, NULL);
        while (choice != 1 && choice != 2 && choice != 3 && choice != 4) {
            printf("未找到命令，请重新输入！\n");
            setbuf(stdin, NULL);   // 是linux中的C函数，主要用于打开和关闭缓冲机制
            scanf("%d", &choice);
            setbuf(stdin, NULL);
        }   // while

        /*清空缓冲区*/
        switch ((MessageType)choice) {
        case MessageType::REGISTER: /*注册请求*/
            message = Message{};
            memset(buf, 0, MAX_LINE);
            message.msgType  = MessageType::REGISTER;
            message.sendAddr = local_addr;
            /*首先向服务器发送注册请求*/
            memcpy(buf, &message, sizeof(message));
            send(sockfd, buf, sizeof(buf), 0);
            ClientRegisterUser(sockfd);
            break;

        case MessageType::LOGIN: /*登陆请求*/
            message = Message{};
            memset(buf, 0, MAX_LINE);
            message.msgType  = MessageType::LOGIN;
            message.sendAddr = local_addr; /*向服务器发送登陆请求*/
            memcpy(buf, &message, sizeof(message));
            send(sockfd, buf, MAX_LINE, 0);
            ClientLoginUser(sockfd);
            break;

        case MessageType::HELP: /*帮助请求，显示帮助界面*/
            helpInterface();
            // goto sign;
            break;

        case MessageType::EXIT:
            close(sockfd);
            printf("退出聊天室!\n");
            exit(0); /*用户退出*/
            break;
        default:
            printf("unknown operation.\n");
            // goto sign;
            break;
        }
    }
    close(sockfd);
    return 0;
}
